#include<iostream>
#include<cmath>
using namespace std;
int T,n,m,L,V,cnt,cnt2,d[100010],v[100010],a[100010],p[100010],l[100010];
int maxer[100010],minier[100010];
int used[100010];
int ans[60][2];
int s;
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&T);
    for(int i=1;i<=T;i++){
        scanf("%d%d%d%d",&n,&m,&L,&V);
        for(int j=1;j<=n;j++){
            scanf("%d%d%d",&d[j],&v[j],&a[j]);
            l[j]=v[j]*v[j]-V*V;
        }
        int Right=0,Left=L;
        for(int j=1;j<=m;j++){
            scanf("%d",&p[j]);
            if(p[j]>Right)Right=p[j];
            if(p[j]<Left)Left=p[j];
        }
        for(int j=1;j<=n;j++){
            if(a[j]==0){
                if(v[j]>V){
                    l[j]=d[j];
                    if(Right>=l[j])ans[i][0]++;
                }
            }else if(a[j]>0){
                l[j]=ceil(l[j]/2.0/a[j]);
                if(Right>=l[j]+d[j])ans[i][0]++;
            }else{//a[j]<0
                if(l[j]>0){
                    l[j]=floor((l[j]+0.5)/-2.0/a[j]);
                    minier[++cnt]=l[j];
                    maxer[cnt]=l[j]+d[j];
                    for(int k=1;k<=m;k++){
                        if(p[k]>=d[j]&&p[k]<=l[j]+d[j]){
                            ans[i][0]++;
                            break;
                        }
                    }
                }
            }
        }
        for(int j=1;j<=m;j++){
            for(int k=j+1;k<=m;k++){
                if(p[k]<p[j]){
                    p[k]=s;
                    p[k]=p[j];
                    p[j]=s;
                }
            }
        }
        ans[i][1]=0;
        for(int j=1;j<=cnt;j++){
            int best=0,sum=0;
            bool isused=false;
            for(int k=1;k<=m;k++){
                if(p[k]>=minier[j]&&p[k]<=maxer[j]){
                    sum++;
                    if(isused==false)best=k;
                    for(int m=1;m<=cnt2;m++){
                        if(best==used[m]){
                            ans[i][1]++;
                            isused=true;
                            break;
                        }
                    }
                }
            }
            if(sum>=1&&isused==false){
                used[++cnt2]=best;
            }
            if(sum>1){
                ans[i][1]--;
                ans[i][1]+=sum;
            }
        }
        for(int j=1;j<=cnt+1;j++){
            maxer[j]=0;
            minier[j]=0;
        }
        cnt=0;
        cnt2=0;
        for(int j=1;j<=n;j++){
            l[n]=0;
            used[j]=0;
        }
    }
    for(int i=1;i<=T;i++){
        printf("%d %d",ans[i][0],ans[i][1]);
        if(i<T)printf("\n");
    }
    return 0;
}
